Laboratorium 6 - część 1/2

W pakiecie OpenCV wszystkie zadania związane z detekcją i opisem punktów kluczowych realizowane są przez zestaw specjalnych klas, dla których bazową jest cv::Feature2D. Jedną z wielu pochodnych tej klasy jest interesująca nas na zajęciach cv::SIFT, z której dokumentacją należy się zapoznać.
Najważniejsze, co trzeba wiedzieć:

  1. do konstrukcji obiektu SIFT służy metoda cv2.SIFT_create - to do niej przekazujemy parametry detektora (w dokumentacji występuje jako cv::SIFT::create);
  2. obsługujemy detektor przez interfejs cv::Feature2D, konkretnie metody detect do detekcji punktów kluczowych oraz compute do obliczania ich deskryptorów (opcjonalnie detectAndCompute).

Schemat użycia:

sift_instance = cv2.SIFT_create()
# 'image' powinno być obrazem jednokanałowym (jeśli nie, zostanie zastosowane cvtColor z flagą COLOR_BGR2GRAY)
keypoints = sift_instance.detect(image)
keypoints, descriptors = sift_instance.compute(image, keypoints)

keypoints jest listą obiektów specjalnego typu cv2.KeyPoint, która jest modyfikowana przez SIFT::compute!
descriptors jest natomiast macierzą float32 o wymiarach NxK, gdzie N jest liczbą punktów kluczowych, a K jest liczbą obliczonych cech.

Warto również zapoznać się z funkcją cv2.drawKeypoints w kontekście prezentacji wyników. Zwróć uwagę na flagi sterujące rysowaniem - szczególnie użyteczna jest cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS.

Zadanie 1

Przetestuj wpływ podstawowych parametrów detektora SIFT (contrastThreshold i edgeThreshold) na uzyskiwane punkty kluczowe (liczność, lokalizacja, rozmiar), korzystając z obrazów cells i lena. Pamiętaj że ich działanie jest odwrotne (tzn. jeden odsiewa cechy "mniejsze niż", a drugi "większe niż").

Punkty kluczowe znajdują się w tych samych miejscach niezależnie od wielkości progów - jedynie są odfiltrowywane większe lub mniejsze. Zarówno dla wzrostu progu kontrastu i krawędzi ilość punktów kluczowych maleje. W taki sam sposób rośnie średnia i odchylenie standardowe wielkości punktów.

Zwiększanie progu krawędziowego sprawia, że wykrywamy mniej punktów w tle obrazu. Zwiększanie progu kontrastowego natomiast zdaje się eliminować głównie bardzo małe punkty .

Dla obrazu cells widzimy podobne zachowanie statystyk punktów kluczowych jak w poprzednim przykładzie. Zauważamy także, średnia i odchylenie wielkości punktów kluczowych jest zależne głównie od progu kontrastowego.

Zadanie 2

Detektor SIFT jest w teorii niezmienniczy względem translacji, rotacji czy zmiany skali. Przetestuj te własności w praktyce, oceniając wizualnie stabilność punktów wykrywanych na obróconej i przeskalowanej wersji obrazów cells i lena.

Ewidentnie punkty nie są niezależne od rotacji i skali - nie dostajemy dokładnie tych samych punktów. Jednak ich lokalizacje zagęszczeń są dosyć podobne. Analizując statystyki widzimy także, że ilość punktów i ich rozmiar zależą głównie od skali.

Odmiennie niż dla poprzedniego przykładu, dla zdjęcia cells ilośc punktów jest największa dla mniejszej skali, a średnie wielkości punktów sa większe dla większej skali.